package com.xcms.test.mail;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.List;
import java.util.Properties;

public class MailHelper {


    //操作结果：创建一个邮件发送对象
    //from：发信人
    //to：收信人
    //subject：邮件主题
    //content：邮件内容
    //host：服务器
    //pwd：授权码
    //files：要发送邮件的附件的路径
    public static boolean sendEmail(String host, String from, String pwd, String to, String subject, String content, List<String> files){
        try {
            //1.创建参数配置，用于连接邮件服务器的参数配置
            //放到配置文件
            //放到数据库里面 推荐
            Properties properties=new Properties();
            properties.setProperty("mail.transport.protocol","smtp");
            properties.setProperty("mail.smtp.host",host);
            properties.setProperty("mail.smtp.auth","true");

            //2.根据配置创建会话对象，用于和邮件服务器交互
            Session session=Session.getInstance(properties);
            session.setDebug(true); //有debug信息
            //3.创建一封邮件
            //3.1创建一封邮件
            MimeMessage mimeMessage=new MimeMessage(session);   //默认创建的是简单邮件
            //3.2From：发件人
            mimeMessage.setFrom(new InternetAddress(from,from,"UTF-8"));
            //3.3To：收件人（可以增加多个收件人、抄送、密送
            mimeMessage.setRecipients(MimeMessage.RecipientType.TO,new InternetAddress[]{new InternetAddress(to,to,"UTF-8")});
            //3.4邮件主题
            mimeMessage.setSubject(subject,"UTF-8");

            if(files.size()>0){     //带附件邮件
                //创建邮件正文，为了避免邮件正文中文乱码问题需要使用charset=UTF-8指明字符编码
                MimeBodyPart text=new MimeBodyPart();   //复杂邮件
                text.setContent(content,"text/html;charset=UTF-8");
                //创建容器描述数据关系
                MimeMultipart mp=new MimeMultipart();   //各个附件的关系问题，邮件的各种数据类型的集合
                mp.addBodyPart(text);
                for(String file:files){     //遍历files集合
                    MimeBodyPart attach=new MimeBodyPart();     //创建邮件附件
                    DataHandler dh=new DataHandler(new FileDataSource(file));
                    attach.setDataHandler(dh);
                    attach.setFileName(dh.getName());
                    mp.addBodyPart(attach);
                }
                mp.setSubType("mixed");     //设置类型
                mimeMessage.setContent(mp,"text/html;charset=UTF-8");
            }
            else
                //3.5Content：邮件正文（可以用HTML标签）
                mimeMessage.setContent(content,"text/html;charset=UTF-8");
            //3.6设置发件时间
            mimeMessage.setSentDate(new Date());
            //3.7保存设置
            mimeMessage.saveChanges();
            //4.根据Session获取邮件传输对象
            Transport transport=session.getTransport();
            //5.使用邮箱账号和密码连接邮件服务器，这里认证的邮箱必须与message中的发件人邮箱一致，否则报错
            transport.connect(from,pwd);
            //6.发送邮件，发到所有的收件地址，mimeMessage.getAllRecipients()获取到的是在创建邮件对象时添加的所有收件人
            transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
            //7.关闭连接
            transport.close();
            return true;
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return false;
    }
}
